#include "visit.h"

void visitAssignExp(ASTNode *ctx, SymbolTable *s, Module *m, BasicBlock* bb) {

    string input = ctx->value;
    size_t equalPos = input.find('=');
    if (equalPos == string::npos) {
        throw invalid_argument("缺少等号 '='");
    }
    
    // 提取左值（变量名）和右值表达式
    string left_val = input.substr(0, equalPos);
    string lhs_var = removeRedundantBrackets(left_val);
    string rhs_expr = input.substr(equalPos + 1);

    // 查找左值符号
    Symbol* lhs_symbol = s->lookup(lhs_var);
    if (!lhs_symbol) {
        throw invalid_argument("变量未声明: " + lhs_var);
    }

    // 处理右值（可能是常量或变量）
    Value* rhs_value = nullptr;
    try {
        // 尝试解析为整数常量
        int const_val = stoi(rhs_expr);
        rhs_value = ConstantInt::get(const_val, m);
    } catch (const invalid_argument&) {
        // 解析失败，视为变量引用
        string rhs_var = removeRedundantBrackets(rhs_expr);
        Symbol* rhs_symbol = s->lookup(rhs_var);
        if (!rhs_symbol) {
            throw invalid_argument("右值变量未声明: " + rhs_var);
        }

        // 获取右值变量的指针（全局或局部）
        Value* rhs_ptr = rhs_symbol->isGlobal() ? 
                        static_cast<Value*>(rhs_symbol->gv) : 
                        static_cast<Value*>(rhs_symbol->alloc);
        
        // 加载右值变量的值
        rhs_value = LoadInst::create_load(rhs_ptr->get_type()->get_pointer_element_type(), 
                                    rhs_ptr, bb);
    }

    // 更新左值变量
    if (lhs_symbol->isGlobal()) {
        // 全局变量：直接更新全局常量的值
        if (auto* gv = dynamic_cast<GlobalVariable*>(lhs_symbol->gv)) {
            gv->set_operand(0, rhs_value);
        } else {
            throw runtime_error("全局变量类型不匹配: " + lhs_var);
        }
    } else {
        // 局部变量：生成存储指令
        if (lhs_symbol->alloc) {
            StoreInst::create_store(rhs_value, lhs_symbol->alloc, bb);
        } else {
            throw runtime_error("局部变量未分配内存: " + lhs_var);
        }
    }

    // cout << "变量 " << lhs_var << " 赋值成功" << endl;
}